VAR_CONFIG-Abschnitte im SPS-Objekt deklarieren

Für instanzspezifische Zuweisungen des Speicherorts bei symbolisch dargestellten Variablen benötigen Sie einen VAR_CONFIG-Abschnitt. Dieser Abschnitt ist sowohl in einer →Konfiguration als auch in einer →Ressource möglich.
Dieser Artikel beschreibt die Syntax des VAR_CONFIG-Abschnitts und dessen Einträge im SPS-Objekt.

Syntax
VAR_CONFIG
  name_1 AT %address (* optional_begin *) {SIZE := value} (* optional_end *);
  name_2 AT %address (* optional_begin *) {SIZE := value} (* optional_end *);
  name_3 AT %address (* optional_begin *) {SIZE := value} (* optional_end *); 
  ...
END_VAR
Bedeutung

eine bzw. mehrere instanzspezifische Zuweisungen des Speicherorts bei symbolisch dargestellten Variablen
Die Deklaration eines solchen Abschnitts ist sowohl vor dem Ende einer Konfiguration (END_CONFIGURATION) als auch vor dem Ende einer Ressource (END_RESOURCE) zulässig.

Die folgenden Elemente sind in der entsprechenden Hierarchie für name_1, name_2 usw. möglich (= Symbol (Häkchen)) bzw. nicht möglich (= Symbol (Fehler)):

 

 

im VAR_CONFIG-Abschnitt für eine

Nr.

Element

Konfiguration

Ressource

1

Name einer Ressource

(Häkchen)

(Fehler)

2

Name einer Programminstanz

(Häkchen)

(Häkchen)

3

Name einer Variable

Unterstützt werden dabei die Variablen-Arten: →interne Variablen (VAR...END_VAR), →Eingangsvariablen, →Ausgangsvariablen, →externe Variablen, →globale Variablen

Diese Variablen-Arten werden nicht unterstützt: →Ein-/Ausgangsvariablen, →temporäre Variablen
Falls Sie solche Variablen verwenden, werden diese im Code nicht als fehlerhaft gekennzeichnet. In Folge ist es aber nicht möglich, die Anwendung zu erzeugen oder auf die SPS zu laden.

(Häkchen)

(Häkchen)

4

Name eines Strukturelements,
sofern der Datentyp der globalen Variablen ein →strukturierter Datentyp ist

(Info) Es ist möglich, dass das Strukturelement mit einer partiellen Adresse definiert ist.

(Häkchen)

(Häkchen)

Die Elemente müssen voneinander durch . voneinander getrennt werden.Falls das definierte Element im VAR_CONFIG-Abschnitt nicht eindeutig ist (da z.B. eine globale Variable und die Programminstanz den gleichen Namen haben), können Sie mit Hilfe des Präfixes VAR_GLOBAL# oder PROGRAM# vorgeben, welches der Elemente zu verwenden ist (siehe nachfolgendes Beispiel mit Präfixes). (Warnung) Trotz dieser Möglichkeit empfiehlt Neuron, bei der Deklaration des entsprechenden Elements (z.B. einer globalen Variablen) einen eindeutigen IEC-Bezeichner als Namen zu verwenden.

Mit dem optionalen Schlüsselwort AT können Sie der symbolischen Variable eine physikalische Adresse in der →SPS zuweisen.

Beispiele für physikalische Adressen:

Beispiel

Erläuterung

%QB7

Ausgang, Byte, 7. Element (in der 1. Ebene)

%IX1

Eingang, Bool, 1. Element (in der 1. Ebene)

%I1

Eingang, Bool, 1. Element (in der 1. Ebene)

%IW2.5.7.3

Eingang, Word, 3. Element im 7. "Modul" auf dem 5. "Regal" des 2. "Bus"

Erforderlicher Aufbau für physikalische Adresse

Geben Sie eine physikalische Adresse laut diesem Aufbau ein:

 

Zeichen

Bedeutung

1.

%

leitet die Adresse ein

2.

Präfix für Lage

definiert die Lage

 

I

Eingang

 

Q

Ausgang

 

M

Speicher (Memory)

3.

Präfix für Größe

definiert die Größe

 

X (oder keiner)

Bool (einzelnes Bit)

 

B

Byte (8 Bits)

 

W

Wort (16 Bits)

 

D

Doppelwort (32 Bits)

 

L

Langwort (64 Bits)

4.

eine oder mehrere vorzeichenlose ganze Zahlen (→Unsigned Integers)
Zur Eingabe von hierarchischen Ebenen müssen Sie die Zahlen durch . voneinander trennen.
Die höchste Ebene geben Sie als Zahl ganz links ein, die nächsten Ebenen als Zahlen rechts davon.

Einschränkung

Abhänging von der SPS-Plattform und dem IO-Provider unterstützt Neuron Power Engineer max. 5 Ebenen. Kontaktieren Sie Ihren Systemintegrator für mehr Informationen.
Die höchstmögliche Zahl pro Ebene ist: 4_294_967_295 (das entspricht UINT32_MAX) – Die Unterstrich-Zeichen _ sind nur zur besseren Lesbarkeit eingefügt, _ ist daher nicht signifikant.

 

definiert die Adresse

Das Attribut SIZE wird als Angabe der Bitgröße nur bei nicht-elementaren Datentypen benötigt, um diese verarbeiten zu können. Bei elementaren Datentypen ist das Attribut optional. Das Attribut kann aber auch bei elementaren Datentypen angegeben werden, um z.B. nur ein Byte aus dem IO-Segment in eine WORD-Variable zu kopieren. Ohne SIZE gilt die Bitgröße des zugehörigen Datentyps (sofern ein elementarer Datentyp zugrunde liegt).

Erweiterungen zur IEC-Norm

Der VAR_CONFIG-Abschnitt in einer Ressource und das Attribut SIZE sind Erweiterungen zur →IEC-Norm. Zusätzlich ist es möglich, einen VAR_CONFIG-Abschnitt in einem VarCfg-Objekt zu deklarieren und hier nur einen Verweis einzufügen.

Einschränkungen

Zur Verwendung der VAR_CONFIG-Abschnitte: Neuron Power Engineer unterstützt VAR_CONFIG-Abschnitte derzeit nur bei Verwendung des →EtherCAT IO-Providers. In allen anderen Fällen können Sie zwar die Syntax verwenden, der entsprechende Code wird aber noch nicht für die →SPS erzeugt und auf diese geladen (daher haben die VAR_CONFIG-Abschnitte noch keine Auswirkung auf die Ausführung der Anwendung).
Derzeit unterstützt Neuron Power Engineer bei Verwendung eines IO-Providers für Neuron keine VAR_CONFIG-Abschnitte. Sie können daher zwar die Syntax verwenden, der entsprechende Code wird aber noch nicht für die →SPS erzeugt und auf diese geladen (daher haben die VAR_CONFIG-Abschnitte noch keine Auswirkung auf die Ausführung der Anwendung).

Der VAR_CONFIG-Abschnitt erlaubt keine instanzspezifische Initialisierung.

(Info) Die Deklarationen der entsprechenden Variablen bzw. Datentypen werden vorausgesetzt, damit die folgenden Beispiele soweit wie möglich fehlerfrei sind (siehe "Addendum für Beispiele 1 bis 3" für einen möglichen ST-Code).

Beispiel 1: Abschnitt in Ressource
CONFIGURATION LocalConfiguration
    RESOURCE local ON BuiltInPlc { ON_CHANNEL := LocalChannel }
        VAR_GLOBAL
          valvePos : INT;
        END_VAR
        TASK DefaultTask(INTERVAL := TIME#500ms, PRIORITY := 38229);
        PROGRAM iCounter WITH DefaultTask :
            Counter;
 
        VAR_CONFIG
          (* instance specific location assignments for the variables *)
          iCounter.globVar1.Elem1 AT %IW1.2.3;      (* assigning the location '%IW1.2.3', without size specification *)
          iCounter.globVar2 AT %IB1.4.6 {SIZE:=2};  (* assigning the location '%IB1.4.6', with size specification *)
          (* instance specific location assignments for resource-global variables *)
          valvePos AT %QW28;
        END_VAR
 
    END_RESOURCE
END_CONFIGURATION
Beispiel 2: Abschnitt in Konfiguration
CONFIGURATION LocalConfiguration
    RESOURCE local ON BuiltInPlc { ON_CHANNEL := LocalChannel }
        VAR_GLOBAL
          valvePos : INT;
        END_VAR
        TASK DefaultTask(INTERVAL := TIME#500ms, PRIORITY := 38229);
        PROGRAM iCounter WITH DefaultTask :
            Counter;
    END_RESOURCE
 
        VAR_CONFIG
          (* instance specific location assignments for the variables *)
          local.iCounter.globVar1.Elem1 AT %IW1.2.3;      (* assigning the location '%IW1.2.3', without size specification *)
          local.iCounter.globVar2 AT %IB1.4.6 {SIZE:=2};  (* assigning the location '%IB1.4.6', with size specification *)
          (* instance specific location assignments for resource-global variables *)       
          local.valvePos AT %QW28;
        END_VAR
END_CONFIGURATION
Beispiel 3: Abschnitt in Ressource mit Präfixes
CONFIGURATION LocalConfiguration
    RESOURCE local ON BuiltInPlc { ON_CHANNEL := LocalChannel }
        VAR_GLOBAL
            valvePos  : DT1;
        END_VAR
        TASK DefaultTask ( INTERVAL := TIME#500ms , PRIORITY := 38229 );
        PROGRAM valvePos  WITH DefaultTask :
            Counter;
        
        VAR_CONFIG
            (* ERROR: The following symbolically represented variable is ambiguous because a global variable is named 'valvePos' and the program instance is, too. *)
            (* Best practice is to rename the global variable and the program instance so that they are declared with unique IEC-identifiers as name. *)
            valvePos.Elem1  AT %I1.2.3;
            (* Otherwise enter the prefix 'VAR_GLOBAL#', if the global variable 'valvePos' should be used. *)
            VAR_GLOBAL#valvePos.Elem1  AT %I1.2.3;
            (* Or enter the prefix 'PROGRAM#', if the program instance 'valvePos' should be used. *)
            PROGRAM#valvePos.globVar1.Elem1 AT %I1.2.3;
        END_VAR
    END_RESOURCE
END_CONFIGURATION
Addendum für Beispiele 1 bis 3: Möglicher ST-Code
PROGRAM Counter
  VAR_GLOBAL (* declaration of the corresponding variables; here: of global variables *)
    globVar1 : DT1;
    globVar2 : INT;
  END_VAR
END_PROGRAM
 
TYPE
  DT1 : STRUCT (* declaration of the corresponding data type *)
    Elem1 AT %I* : INT;
  END_STRUCT;
END_TYPE